﻿using Presentacion.Clases.Dto;
using Presentacion.Clases;
using Seg.Entidades;
using Seg.Logica;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace Presentacion.Controllers.Mantenimiento
{
    public class OpcionController : Base
    {
        //
        // GET: /Opcion/
        public List<DTOUsuario> UsuariosTmp
        {
            get
            {
                var lista = (List<DTOUsuario>)Session[Constante.Sesiones.UsuarioRol];
                return lista;
            }
            set
            {
                Session[Constante.Sesiones.UsuarioRol] = value;
            }
        }
        public ActionResult Index()
        {

            Init(false);
            return View();
        }
        public ActionResult Mantenimiento()
        {
            Init(false);
            return View();
        }
        public ActionResult AsignarRol()
        {
            Init(false);
            return View();
        }
        /// <summary>
        /// Agregado DBS
        /// </summary>
        /// <returns></returns>
        public ActionResult Asignar()
        {
            UsuariosTmp = null; 
            Init(false);
            return View();
        }
        public ActionResult ConsultarRol()
        {
            Init(false);
            return View();
        }
        public JsonResult ActualizarAsignacion(int CodigoPerfilUsuaro, string ListaRoles)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!this.isLogout(ref retorno))
                {
                    System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
                    List<DTOPerfilUsuarioOficinaDetalle> lista = js.Deserialize<List<DTOPerfilUsuarioOficinaDetalle>>(ListaRoles);

                    PerfilUsuarioOficinaDetalleLogica servicio = new PerfilUsuarioOficinaDetalleLogica();
                    lista.ForEach(x =>
                    {
                        PerfilUsuarioOficinaDetalle perfUsuOficDetal = new PerfilUsuarioOficinaDetalle();
                        perfUsuOficDetal.CodigoOpcion = x.CodigoOpcion;
                        perfUsuOficDetal.CodigoPerfilUsuario = CodigoPerfilUsuaro;
                        perfUsuOficDetal.TipoAcceso = x.TipoAcceso;
                        var result = servicio.Actualizar(perfUsuOficDetal);
                    });

                    retorno.result = 1;
                    retorno.message = Constante.MensajeGenerico.MSG_OK_GRABAR;
                    QuitarUsuarioTmp(0, 0);
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "actualizar asign rol", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        private string MensajeHtmlValidacion(int resultValidar, decimal codigoUsuario, decimal codigoPerfil)
        {
            
                UsuarioLogica usuLogic = new UsuarioLogica();
                var usu = usuLogic.ObtenerUsuario(codigoUsuario);
                var desUsu = (usu != null) ? String.Format("{0} {1} {2}", usu.Nombre, usu.Paterno, usu.Materno) : "-";


                StringBuilder sb = new StringBuilder();

          
                if (resultValidar == 1)
                {
                    sb.AppendFormat("<li>El usuario {0} estar asignado en varias oficinas. Inactive las oficinas asignadas para continuar.</li>", desUsu);
                }
                if (resultValidar == 2)
                {
                    PerfilLogistica perfLogic = new PerfilLogistica();
                    var perf = perfLogic.ObtenerPerfil(codigoPerfil);
                    var desPerf = (perf != null) ? String.Format("{0}", perf.Nombre) : "-";
                    sb.AppendFormat("<li>El usuario {0} ya tiene asignado el perfil {1}</li>", desUsu, desPerf);
                }
             

                return sb.ToString();
        }
        public JsonResult InsertarAsignacion(int CodigoOficina, int CodigoPerfil, string ListaRoles)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!this.isLogout(ref retorno))
                {
                    System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
                    List<DTOPerfilUsuarioOficinaDetalle> lista = js.Deserialize<List<DTOPerfilUsuarioOficinaDetalle>>(ListaRoles);

                    if (UsuariosTmp != null)
                    {

                        OpcionLogica servicioOpc = new OpcionLogica();
                        //UsuariosTmp.ForEach(x =>
                        int cuenta = 1;
                        string sb = string.Empty;
                        foreach (var x in UsuariosTmp)
                        {
                            UsuarioOficina usuarioOfi = new UsuarioOficina() { CodigoOficina = CodigoOficina, CodigoUsuario = x.CodigoUsuario };
                            int resultValidar = servicioOpc.ValidarUsuarioXPerfilUsuario(CodigoOficina, CodigoPerfil, x.CodigoUsuario);
                            if (resultValidar > 0)
                            {
                                
                                if (cuenta == 1)
                                {
                                    sb = "<label id='lblTituloValidAsignar'>Resultado de Validación:  &nbsp;&nbsp;<img src='../Images/botones/warning.png' /> </label><br/>";
                                    sb += "<ul id='ulValidaAsignar'>";
                                    retorno.html = String.Format("{0} {1}", retorno.html, sb);
                                }
                                
                                retorno.html = String.Format("{0} {1}", retorno.html, MensajeHtmlValidacion(resultValidar, x.CodigoUsuario, CodigoPerfil));
                                if (cuenta == UsuariosTmp.Count)  retorno.html = String.Format("{0}</ul>", retorno.html);
                                cuenta++;
                                retorno.result = 1;
                                retorno.message = Constante.MensajeGenerico.MSG_OK_GRABAR;
                            }
                            else
                            {

                                var CodigoUsuarioOficina = new UsuarioOficinaLogica().Insertar(usuarioOfi);

                                if (CodigoUsuarioOficina != 0)
                                {
                                    PerfilUsuarioOficina perfilUsuOfi = new PerfilUsuarioOficina();
                                    perfilUsuOfi.CodigoUsuarioOficina = CodigoUsuarioOficina;
                                    perfilUsuOfi.CodigoPerfil = CodigoPerfil;

                                    var CodigoPerfilUsuario = new PerfilUsuarioOficinaLogica().Insertar(perfilUsuOfi);

                                    if (CodigoPerfilUsuario != 0)
                                    {
                                        lista.ForEach(c =>
                                        {
                                            PerfilUsuarioOficinaDetalle perfilUsuOfiDeta = new PerfilUsuarioOficinaDetalle();
                                            perfilUsuOfiDeta.CodigoPerfilUsuario = CodigoPerfilUsuario;
                                            perfilUsuOfiDeta.CodigoOpcion = c.CodigoOpcion;
                                            perfilUsuOfiDeta.TipoAcceso = c.TipoAcceso;

                                            var result = new PerfilUsuarioOficinaDetalleLogica().Insertar(perfilUsuOfiDeta);
                                        });
                                        retorno.result = 1;
                                        retorno.message = Constante.MensajeGenerico.MSG_OK_GRABAR;
                                        QuitarUsuarioTmp(0, 0);
                                    }
                                    else
                                    {
                                        retorno.result = 0;
                                        retorno.message = "Error al insertar la configuración del Perfil - Usuario.";
                                    }
                                }
                                else
                                {
                                    retorno.result = 0;
                                    retorno.message = "Error al insertar la configuracion del Usuario - Oficina.";
                                }
                            }

                        }//);
                    }
                    else
                    {
                        retorno.result = 0;
                        retorno.message = "No ha seleccionado usuario (s) para asignar el rol.";
                    }
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP,UsuarioActual,"registrar asign rol", ex);
                
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ListarHtml(int CodigoSistema) {

            Resultado retorno = new Resultado();
            try
            {
                if (!this.isLogout(ref retorno))
                {
                    //OpcionLogica servicio = new OpcionLogica();
                    //var datos = servicio.Listar(0, 0, 0);

                    SistemaLogica servicio = new SistemaLogica();
                    var datos = servicio.ListarSistemas(CodigoSistema);

                    StringBuilder sb = new StringBuilder();
                    if (datos != null)
                    {

                        sb.Append("<center><div  class='divFiltro'><table border=0   style=' width:70%;text-align:left;  box-shadow: 5px 10px 7px rgba(0,0,0,0.5);background:#ecf8fd;   border:1px #a6c9e2 solid;     '><tr><td  colspan=2> </td></tr>");

                        foreach (var item in datos)
                        {
                            sb.Append(" <tr>");
                            sb.AppendFormat("<td colspan=2 style='font-size:14px;'><img src='../Imagen/icono/plus.png' width=16 id='imgExpand_{1}' onclick='return verModulo({1});'>{0}&nbsp;", item.Nombre, item.CodigoSistema);
                            if (item.Nombre != string.Empty)
                            {
                                sb.AppendFormat("&nbsp;&nbsp;<a href='#' onclick='return addModulo({0});' title='Agregar módulo al sistema.'><img src='../Imagen/icono/module.png' width=16></a>", item.CodigoSistema);
                            }
                            sb.Append(" </td></tr>");
                            sb.AppendFormat(" <div id='divContent_{0}' style='display:none;'>", item.CodigoSistema);
                            sb.Append(" <tr>");
                            sb.AppendFormat("<td style=' width:30px;'></td><td><div id='divGrilla_{0}'></div></td>", item.CodigoSistema);
                            sb.Append(" </tr>");
                            sb.Append(" </div>");
                        }
                        sb.Append("</table></div></center>");

 

                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch(Exception ex) {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarHtml", ex);
            }

            return Json(retorno, JsonRequestBehavior.AllowGet);
       
        }




        public JsonResult ListarModuloHtml(int idSist,int idModulo)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!this.isLogout(ref retorno))
                {
                    ModuloLogistica servicio = new ModuloLogistica();
                    var datos = servicio.ListarXSistema(idSist,idModulo);

                    StringBuilder sb = new StringBuilder();
                    if (datos != null)
                    {
                        sb.Append("<table border=0 style=' width:100%; text-align:left;'> ");
            
                        foreach (var item in datos )
                        {
                                sb.Append(" <tr>");
                                sb.AppendFormat("<td colspan=2 style='font-size:12px;'><img src='../Imagen/icono/plus.png' width=16 id='imgExpandPerfil_{1}'  onclick='verPerfil({1});'>{0}&nbsp;", item.Nombre, item.CodigoModulo);
                                if (item.Nombre != string.Empty)
                                {
                                    sb.AppendFormat("&nbsp;&nbsp; <a href='#' onclick='return addPerfil({0});' title='Agregar perfil al módulo'><img src='../Imagen/icono/profile.png' width=16></a>", item.CodigoModulo);
                                }
                                sb.Append(" </td></tr>");
                                sb.AppendFormat(" <div id='divContentPerfil_{0}' style='display:none;'>", item.CodigoModulo);
                                sb.Append(" <tr>");
                                sb.AppendFormat("<td style=' width:30px;'></td><td><div id='divGrillaPerfil_{0}'></div></td>", item.CodigoModulo);
                                sb.Append(" </tr>");
                                sb.Append(" </div>");
                        }
                        sb.Append("</table>");
                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch(Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarModuloHtml", ex);
            }

            return Json(retorno, JsonRequestBehavior.AllowGet);

        }

        public JsonResult ListarPerfilHtml(int idModulo,int idPerfil)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!this.isLogout(ref retorno))
                {
                    PerfilLogistica servicio = new PerfilLogistica();
                    var datos = servicio.ListarXModulo(idModulo,idPerfil);

                    StringBuilder sb = new StringBuilder();
                    if (datos != null)
                    {
                        sb.Append("<table  style=' width:100%; text-align:left;'>");

                        foreach (var item in datos)
                        {
                            sb.Append(" <tr>");
                            sb.AppendFormat("<td colspan=2 style='font-size:11px;text-decoration:underline;'><img src='../Imagen/icono/plus.png' width=16 id='imgExpandOpc_{1}'  onclick='verOpciones({1});'>{0} ", item.Nombre, item.CodigoPerfil);
                            
                            if (item.Nombre != string.Empty)
                            {
                                sb.AppendFormat("&nbsp;&nbsp; <a href='#' onclick='return addOpcion({0});'  title='Agregar opción al perfil {1} - opción Nivel 1'><img src='../Imagen/icono/tree.png' width=16></a>", item.CodigoPerfil, item.Nombre);
                            }


                            sb.Append("</td> </tr>");
                            sb.AppendFormat(" <div id='divContentOpc_{0}' style='display:none;'>", item.CodigoPerfil);
                            sb.Append(" <tr>");
                            sb.AppendFormat("<td style=' width:30px;'></td><td><div id='divGrillaOpc_{0}'></div></td>", item.CodigoPerfil);
                            sb.Append(" </tr>");
                            sb.Append(" </div>");
                        }
                        sb.Append("</table>");
                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch(Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarPerfilHtml", ex);
            }

            return Json(retorno, JsonRequestBehavior.AllowGet);

        }

        public JsonResult ListarOpcionHtml(int idPerfil)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!isLogout(ref retorno))
                {
                    OpcionLogica servicio = new OpcionLogica();
                 //   var datos = servicio.ListarXPerfil(idPerfil);

                    var datos = servicio.ListarXPerfilOpcPadre(idPerfil, 0);
                    StringBuilder sb = new StringBuilder();
                    if (datos != null)
                    {
                        sb.Append("<table border=0   style=' width:100%; text-align:left;'>");
                        foreach (var item in datos)
                        {
                         //   var opciones = item.PerfilOpcion.Where(x => x.CodigoPerfil == idPerfil).ToList();
                         //   if (opciones != null && opciones.Count > 0)
                         //   {
                           //     if (item.Nivel == 1)
                           //     {
                                    sb.Append(" <tr>");
                                    sb.Append("<td colspan=2>");

                                sb.Append("<table border=0 cellspacing=0 cellpadding=0>");
                                sb.Append("<tr>");
                                sb.Append("<td style=' width:150px;'>");

                                sb.AppendFormat("<img src='../Imagen/icono/plus.png' width=16 id='imgExpandOpc_{2}_{1}'  onclick='verOpcionesRec({2},{1});'><b><i>{0}</i></b> ", item.Nombre, item.CodigoOpcion, idPerfil);
                                    if (item.Nombre != string.Empty)
                                    {
                                        sb.Append("</td><td>");
                                        sb.AppendFormat("&nbsp;&nbsp;<a href='#' onclick='return addOpcionRec({1},{0});' title='Agregar sub opción a opción {2}.'><img src='../Imagen/icono/addTree.png' width=16></a>", item.CodigoOpcion, idPerfil, item.Nombre);
                                    }
                                    sb.Append("</td><td>");
                                    sb.AppendFormat("&nbsp;&nbsp;<a href='#' onclick='return moverOpcion({1},{0},{2},-1);' title='bajar posición.'><img src='../Imagen/icono/down.png' width=16></a>", item.CodigoOpcion, idPerfil, item.Orden);
                                    sb.Append("</td><td>");
                                    sb.AppendFormat("&nbsp;&nbsp;<a href='#' onclick='return moverOpcion({1},{0},{2},1);' title='subir posición.'><img src='../Imagen/icono/up.png' width=16></a>", item.CodigoOpcion, idPerfil, item.Orden);

                                    sb.Append(" </td></tr></table>");

                                    sb.Append(" </td></tr>");
                                    sb.AppendFormat(" <div id='divContentOpc_{1}_{0}' style='display:none;'>", item.CodigoOpcion, idPerfil);
                                    sb.Append(" <tr>");
                                    sb.AppendFormat("<td style=' width:30px;'></td><td><div id='divGrillaOpc_{1}_{0}'></div></td>", item.CodigoOpcion, idPerfil);
                                    sb.Append(" </tr>");
                                    sb.Append(" </div>");
                                }
                          //  }
                      //  }
                        sb.Append("</table>");
                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch(Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarOpcionHtml", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ListarOpcionRecHtml(int idPerfil, int idOpcPadre)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!isLogout(ref retorno))
                {
                    OpcionLogica servicio = new OpcionLogica();
                 //   var datos = servicio.ListarXPerfil(idPerfil);
                    var datos = servicio.ListarXPerfilOpcPadre(idPerfil, idOpcPadre);

                    StringBuilder sb = new StringBuilder();
                    if (datos != null)
                    {
                        sb.Append("<table border=0  style=' width:100%; text-align:left;'>");
                        foreach (var item in datos)
                        {
                            //if (item.CodigoOpcionPadre == idOpc)
                            //{
                                sb.Append(" <tr>");
                                // sb.AppendFormat("<td colspan=2><img src='../Imagen/icono/plus.png' id='imgExpandOpc_{3}_{2}'  onclick='verOpcionesRec({3},{2});'>{0}&nbsp;{3}_{2} ", item.Nombre, item.CodigoOpcion, idPerfil);
                                sb.Append("<td colspan=2>");

                                sb.Append("<table border=0 cellspacing=0 cellpadding=0>");
                                sb.Append("<tr>");
                                sb.Append("<td style=' width:100px;'>");

                                sb.AppendFormat("<img src='../Imagen/icono/plus.png' width=16 id='imgExpandOpc_{2}_{1}'  onclick='verOpcionesRec({2},{1});'><label style='width:100px;'>{0}</label>", item.Nombre, item.CodigoOpcion, idPerfil);
                                
                                if (item.Nombre != string.Empty)
                                {
                                    sb.Append("</td><td>");
                                    sb.AppendFormat(" &nbsp;&nbsp;<a href='#' onclick='return addOpcionRec({1},{0});' title='Agregar sub opción a opción {2}.'><img src='../Imagen/icono/addChild.png' width=16></a>", item.CodigoOpcion, idPerfil,item.Nombre);
                                    
                                }
                                sb.Append("</td><td>");
                                sb.AppendFormat("&nbsp;&nbsp;<a href='#' onclick='return moverOpcionRec({1},{0},{2},{3},-1);' title='bajar posición.'><img src='../Imagen/icono/down.png' width=16></a>", item.CodigoOpcion, idPerfil, item.Orden, idOpcPadre);
                                sb.Append("</td><td>");
                                sb.AppendFormat("&nbsp;&nbsp;<a href='#' onclick='return moverOpcionRec({1},{0},{2},{3},1);' title='subir posición.'><img src='../Imagen/icono/up.png' width=16></a>", item.CodigoOpcion, idPerfil, item.Orden, idOpcPadre);

                                sb.Append(" </td></tr></table>");

                                sb.Append(" </td></tr>");
                                sb.AppendFormat(" <div id='divContentOpc_{1}_{0}' style='display:none;'>", item.CodigoOpcion, idPerfil);
                                sb.Append(" <tr>");
                                sb.AppendFormat("<td style=' width:30px;'></td><td><div id='divGrillaOpc_{1}_{0}'></div></td>", item.CodigoOpcion, idPerfil);
                                sb.Append(" </tr>");
                                sb.Append(" </div>");
                           // }
                        }
                        sb.Append("</table>");
                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarOpcionRecHtml", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }

        public JsonResult Insertar(DTOOpcion entidad)
        {
            Resultado resultado = new Resultado();
            try
            {
                if (!isLogout(ref resultado))
                {

                    OpcionLogica servicio = new OpcionLogica();
                    Opcion dato = new Opcion
                    {
                        Nivel = entidad.Nivel == 0 ? 1 : entidad.Nivel,
                        Nombre = entidad.Nombre,
                        Descripcion = entidad.Descripcion,
                        Ruta = entidad.Ruta,
                        Anulado = false,
                        FechaCreacion = DateTime.Now,
                        UsuarioCreacion = 1,
                        CodigoOpcionPadre = entidad.CodigoPadre == 0 ? null : entidad.CodigoPadre
                        
                    };
                    servicio.Insertar(dato, entidad.CodigoPerfil);
                    resultado.result = 1;
                    resultado.message = Constante.MensajeGenerico.MSG_OK_GRABAR;
                }
            }
            catch (Exception ex)
            {
                resultado.result = 0;
                resultado.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "Insertar", ex);
            }
            return Json(resultado, JsonRequestBehavior.AllowGet);
        }
        public JsonResult OpcionXPerfilAutoCompletar()
        {
            Resultado resultado = new Resultado();
            
                string descripcion = Request.QueryString["term"];
                int idPerfil = Convert.ToInt32(Request.QueryString["tisn"]);

                var datos = new PerfilOpcionLogica().PerfilXCodigoOpcion(descripcion, idPerfil);
                List<DTOOpcion> opciones = new List<DTOOpcion>();
                if (!isLogout(ref resultado))
                {
                    datos.ForEach(c =>
                    {
                        opciones.Add(new DTOOpcion
                            {
                                Code = c.CodigoOpcion,
                                value = c.Nombre
                            });
                    });
                }
                return Json(opciones, JsonRequestBehavior.AllowGet);
        }
        public JsonResult OpcionAutoCompletar()
        {
            Resultado resultado = new Resultado();
            string descripcion = Request.QueryString["term"];
            var datos = new OpcionLogica().OpcionAutoCompletado(descripcion);

            List<DTOOpcion> opciones = new List<DTOOpcion>();
            if (!isLogout(ref resultado))
            {
                datos.ForEach(c =>
                {
                    opciones.Add(new DTOOpcion
                    {
                        Code = c.CodigoOpcion,
                        value = c.Nombre
                    });
                });
            }
            return Json(opciones, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ListarUsuarioOpcionJQGRID(string nombre, string anulado, string sidx, string sord, int page, int rows)
        {
            List<SEGSS_USUARIO_X_NOMBRE_Result> listaUsuario = new OpcionLogica().ListaUsuarioXRoles(nombre, anulado);

            var count = listaUsuario.Count();
            int pageIndex = page - 1;
            int pageSize = rows;
            int totalRecords = count;
            int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);

            var items = listaUsuario.Skip(pageIndex * pageSize).Take(pageSize);

            var result = new
            {
                total = totalPages,
                page,
                records = count,
                rows = (
                    from item in items
                    select new
                    {
                        id = item.CodigoPerdilUsuario,
                        cell = new string[] { 
                            item.CodigoPerdilUsuario.ToString(),
                            item.CodigoUsuario.ToString(),
                            item.NombreUsuario,
                            item.CodigoOficina.ToString(),
                            item.NombreOficina,
                            item.CodigoPerfil.ToString(),
                            item.NombrePerfil,
                            item.CodigoModulo.ToString(),
                            item.NombreModulo,
                            item.CodigoSistema.ToString(),
                            item.NombreSistema,
                            Convert.ToString(item.AnuladoPerfil == true ? "Inactivo" : "Activo") 
                        }
                    }).ToArray()
            };
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ListarOpcionJGrid(int CodigoSistema,int CodigoModulo,int CodigoPerfil,string anulado, string sidx, string sord, int page, int rows)
        {
            OpcionLogica servicio = new OpcionLogica();
            List<DTOOpcion> lst = new List<DTOOpcion>();

            //var opciones = servicio.ListarOpcion(CodigoSistema, CodigoModulo, CodigoPerfil, anulado);
            List<SEGSS_OPCION_X_SITUACION_Result> opciones = servicio.ListarOpcion(CodigoSistema, CodigoModulo, CodigoPerfil, anulado);

            opciones.ForEach(c =>
            {
                DTOOpcion opcionDTO = new DTOOpcion();
                opcionDTO.Codigo = c.CodigoOpcion;
                opcionDTO.Nombre = c.Nombre;
                opcionDTO.Descripcion = c.Descripcion;
                opcionDTO.Ruta = c.Ruta;
                opcionDTO.Nivel = c.Nivel;
                opcionDTO.DescripcionPadre = c.CodigoOpcionPadre == null ? "" : new OpcionLogica().OpcionXCodigo(Convert.ToInt32(c.CodigoOpcionPadre)).Nombre;
                opcionDTO.Anulado = c.Anulado;
                lst.Add(opcionDTO);
            });

            var count = lst.Count();
            int pageIndex = page - 1;
            int pageSize = rows;
            int totalRecords = count;
            int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);

            var items = lst.Skip(pageIndex * pageSize).Take(pageSize);

            var result = new
            {
                total = totalPages,
                page,
                records = count,
                rows = (
                    from item in items
                    select new
                    {
                        id = item.Codigo,
                        cell = new string[] { 
                            item.Codigo.ToString(),
                            item.Nombre,
                            item.Descripcion,
                            item.Ruta,
                            item.DescripcionPadre,
                            Convert.ToString(item.Anulado == true ? "Inactivo" : "Activo") 
                        }
                    }).ToArray()
            };
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        public JsonResult Actualizar(DTOOpcion entidad)
        {
            Resultado resultado = new Resultado();
            try
            {
                if (!isLogout(ref resultado))
                {
                    Opcion opcion = new Opcion
                    {
                        CodigoOpcion = Convert.ToInt32(entidad.Codigo),
                        Nivel = entidad.Nivel == 0 ? 1 : entidad.Nivel,
                        Nombre = entidad.Nombre,
                        Descripcion = entidad.Descripcion,
                        Ruta = entidad.Ruta,
                        Anulado = entidad.Anulado,
                        FechaCreacion = DateTime.Now,
                        UsuarioCreacion = 1,
                        CodigoOpcionPadre = entidad.CodigoPadre == 0 ? null : entidad.CodigoPadre

                    };
                    OpcionLogica servicio = new OpcionLogica();
                    servicio.Actualizar(opcion);
                    resultado.result = 1;
                    resultado.message = Constante.MensajeGenerico.MSG_OK_GRABAR;
                }
            }
            catch (Exception ex)
            {
                resultado.result = 0;
                resultado.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "Actualizar", ex);
            }
            return Json(resultado, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ObtenerOpcion(int CodigoOpcion)
        {
            Resultado resultado = new Resultado();
            try
            {
                if (!isLogout(ref resultado))
                {
                    OpcionLogica servicio = new OpcionLogica();
                    DTOOpcion opcion = new DTOOpcion();

                    var result = servicio.OpcionXCodigo(CodigoOpcion);
                    Perfil perfil = new Perfil();
                    Modulo modulo = new Modulo();

                    opcion.Codigo = result.CodigoOpcion;
                    opcion.Nombre = result.Nombre;
                    opcion.Descripcion = result.Descripcion;
                    opcion.Ruta = result.Ruta;
                    opcion.Nivel = result.Nivel;
                    if(result.CodigoOpcionPadre != null)
                    {
                        opcion.CodigoPadre = result.CodigoOpcionPadre;
                        opcion.DescripcionPadre = servicio.OpcionXCodigo(Convert.ToInt32(result.CodigoOpcionPadre)).Nombre;
                    }
                    opcion.CodigoPerfil = new PerfilOpcionLogica().PerfilOpcionXOpc(result.CodigoOpcion).CodigoPerfil;
                    
                    perfil = new PerfilLogistica().ObtenerPerfil(opcion.CodigoPerfil);
                    modulo = new ModuloLogistica().ObtenerModulo(Convert.ToInt32(perfil.CodigoModulo));

                    opcion.CodigoModulo = modulo.CodigoModulo;
                    opcion.CodigoSistema = modulo.CodigoSistema;
                    opcion.Anulado = result.Anulado;

                    resultado.result = 1;
                    resultado.data = Json(opcion, JsonRequestBehavior.AllowGet);
                }
            }
            catch (Exception ex)
            {
                resultado.result = 0;
                resultado.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "Obtener Opcion", ex);
            }
            return Json(resultado, JsonRequestBehavior.AllowGet);
        }
        public JsonResult Eliminar(Opcion entidad)
        {
            Resultado resultado = new Resultado();
            try
            {
                if (!isLogout(ref resultado))
                {
                    OpcionLogica servicio = new OpcionLogica();
                    var result = servicio.Eliminar(entidad.CodigoOpcion);

                    if (result == 1)
                    {
                        resultado.result = 1;
                        resultado.message = Constante.MensajeGenerico.MSG_OK_ELIMINAR;
                    }
                    else
                    {
                        resultado.result = 0;
                        resultado.message = Constante.MensajeGenerico.MSG_ERROR_ELIMINAR;
                    }
                }
            }
            catch (Exception ex)
            {
                resultado.result = 0;
                resultado.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "Eliminar", ex);
            }
            return Json(resultado, JsonRequestBehavior.AllowGet);
        }

        public JsonResult ListarAsignarPerfilHtml(int idModulo, int idPerfil)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!this.isLogout(ref retorno))
                {
                    PerfilLogistica servicio = new PerfilLogistica();
                    var datos = servicio.ListarXModulo(idModulo, idPerfil);

                    StringBuilder sb = new StringBuilder();
                    if (datos != null)
                    {
                        //<center>
                        sb.Append("<div  class='divFiltro'><table border=0 style=' width:100%;text-align:left;  box-shadow: 5px 10px 7px rgba(0,0,0,0.5);background:#ecf8fd;   border:1px #a6c9e2 solid;'>");

                        foreach (var item in datos)
                        {
                            sb.Append(" <tr>");
                            sb.AppendFormat("<td colspan=2 style='font-size:11px;text-decoration:underline;'><img src='../Imagen/icono/plus.png' width=16 id='imgExpandOpc_{1}'  onclick='verOpciones({1});'>{0} ", item.Nombre, item.CodigoPerfil);

                            if (item.Nombre != string.Empty)
                            {
                                //sb.AppendFormat("&nbsp;&nbsp; <a href='#' onclick='return addOpcion({0});'  title='Agregar opción al perfil - Nivel 1'><img src='../Imagen/icono/option.png' width=16></a>", item.CodigoPerfil);
                                sb.AppendFormat("<input type='checkbox' id='cbPerfil_{0}' onclick='return cambiarEscritura(this,{0});' />", item.CodigoPerfil);
                                sb.AppendFormat("<input type='hidden' id='hidPerfil' value='{0}' />", item.CodigoPerfil);
                            }
                            sb.Append("</td> </tr>");
                            sb.AppendFormat(" <div id='divContentOpc_{0}' style='display:none;'>", item.CodigoPerfil);
                            sb.Append(" <tr>");
                            sb.AppendFormat("<td colspan='2'><div id='divGrillaOpc_{0}'></div></td>", item.CodigoPerfil);
                            sb.Append(" </tr>");
                            sb.Append(" </div>");
                        }
                        sb.Append("<table></div>");//</center>
                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch(Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarAsignarPerfilHtml", ex);
            }

            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ListarAsignarOpcionHtml(int idPerfil)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!isLogout(ref retorno))
                {
                    OpcionLogica servicio = new OpcionLogica();
                    var datos = servicio.ListarXPerfil(idPerfil);
                    if (datos != null)
                    {
                        List<DTOOpcion> opciones = new List<DTOOpcion>();
                        datos.ForEach(x =>
                        {
                            opciones.Add(new DTOOpcion
                            {
                                CodigoOpcion = x.CodigoOpcion,
                                CodigoModulo = Convert.ToDecimal(x.CodigoModulo),
                                Anulado = x.Anulado,
                                CodigoOpcionPadre = x.CodigoOpcionPadre,
                                Descripcion = x.Descripcion,
                                Nivel = x.Nivel,
                                Ruta = x.Ruta,
                                Nombre = x.Nombre,
                                TipoAcceso = "",
                                CodigoPerfil = idPerfil
                            });
                             
                        });
 

                        StringBuilder sb = new StringBuilder();
                        sb.AppendFormat("<table id='tb_{0}' border=0 style=' width:100%; text-align:left;'><tr><td style='text-align:top;'>", idPerfil);
                        var str = OpcionHtml(opciones, idPerfil, 0);
                        sb.Append(str);
                        sb.Append("</td></tr><table>");

                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarAsignarOpcionHtml", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ListarAsignarOpcionRecHtml(int idPerfil, int idOpc)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!isLogout(ref retorno))
                {
                    OpcionLogica servicio = new OpcionLogica();
                    var datos = servicio.ListarXPerfil(idPerfil);

                    if (datos != null)
                    {
                        List<DTOOpcion> opciones = new List<DTOOpcion>();
                        datos.ForEach(x =>
                        {
                            opciones.Add(new DTOOpcion
                            {
                                CodigoOpcion = x.CodigoOpcion,
                                CodigoModulo = Convert.ToDecimal(x.CodigoModulo),
                                Anulado = x.Anulado,
                                CodigoOpcionPadre = x.CodigoOpcionPadre,
                                Descripcion = x.Descripcion,
                                Nivel = x.Nivel,
                                Ruta = x.Ruta,
                                Nombre = x.Nombre,
                                TipoAcceso = "",
                                CodigoPerfil = idPerfil
                            });
                        });
                        StringBuilder sb = new StringBuilder();
                        sb.Append("<table border=0  style=' width:100%; text-align:left;'><tr><td>");
                        var str = OpcionHtml(opciones, idPerfil, idOpc);
                        sb.Append("</td></tr><table>");

                        retorno.result = 1;
                        retorno.message = sb.ToString();
                    }
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarAsignarOpcionRecHtml", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ListarUsuarioTmp(int Tipo)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!isLogout(ref retorno))
                {
                    StringBuilder sb = new StringBuilder();
                    string headerUsu = " <div class='ui-jqgrid-titlebar ui-widget-header ui-corner-top ui-helper-clearfix'><a role='link' class='ui-jqgrid-titlebar-close HeaderButton' style='right: 0px;'> </a><span class='ui-jqgrid-title'>Usuarios para perfil seleccionado.</span></div>";
                    sb.Append("<table style=' width:100%;border: 1px solid; border-radius: 5px;'>");
                    sb.AppendFormat("<tr><td align='left' colspan='2' >{0}</td></tr>", headerUsu);

                    


                    var c = 0;
                    if (UsuariosTmp != null)
                    {
                        var i = UsuariosTmp.Count();
                        UsuariosTmp.ForEach(x =>
                        {
                            var css = c == i ? "" : "style='border-bottom: 1px solid;'";
                            sb.AppendFormat("<tr {0} >", css);
                            sb.AppendFormat("<td align='left' >{0}</td>", x.Nombre);
                            if (Tipo == 1)
                            {
                                sb.AppendFormat("<td align='center'><img src='../Imagen/icono/del.png' width=16 onclick='quitarUsuario({0},1);'/>", x.CodigoUsuario);
                            }
                            sb.Append("</tr>");
                            c++;
                        });
                    }
                    sb.AppendFormat("<tr><td colspan='2'><input type='hidden' id='hidTotUsuariosTmp' value='{0}' /></td></tr>", c);

                    sb.Append("</table>");
                    retorno.result = 1;
                    retorno.message = sb.ToString();
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarAsignarOpcionRecHtml", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        public JsonResult AgregarUsuarioTmp(int CodigoUsuario, string NombreUsuario, int CodigoOficina)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!isLogout(ref retorno))
                {
                    var flag_exito = new UsuarioOficinaLogica().validarUsuarioXOficina(CodigoUsuario, CodigoOficina);

                    if (flag_exito)
                    {
                        DTOUsuario usu = new DTOUsuario();
                        var count = 0;
                        if (UsuariosTmp == null)
                        {
                            UsuariosTmp = new List<DTOUsuario>();
                        }
                        else
                        {
                            count = UsuariosTmp.Where(x => x.CodigoUsuario == CodigoUsuario).Count();
                        }

                        if (count == 0)
                        {
                            usu.CodigoUsuario = CodigoUsuario;
                            usu.Nombre = NombreUsuario;
                            UsuariosTmp.Add(usu);

                            retorno.result = 1;
                        }
                        else
                        {
                            retorno.result = 0;
                            retorno.message = "El usuario ya se encuentra en la lista temporal de usuarios.";
                        }
                    }
                    else
                    {
                        retorno.result = 0;
                        retorno.message = "El usuario sólo puede estar asignado a una oficina activa.\nPara continuar inactive oficinas donde se encuentre asignado.";
                    }
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ListarAsignarOpcionRecHtml", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        public JsonResult QuitarUsuarioTmp(int CodigoUsuario, int tipo)
        {
            Resultado retorno = new Resultado();
            try
            {
                if (!isLogout(ref retorno))
                {
                    if (tipo == 1)
                    {
                        var obj = UsuariosTmp.Where(x => x.CodigoUsuario == CodigoUsuario).FirstOrDefault();
                        UsuariosTmp.Remove(obj);
                    }
                    else
                    {
                        if (UsuariosTmp != null) UsuariosTmp = null;
                    }
                    retorno.result = 1;
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "QuitarUsuarioTmp", ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="datos"></param>
        /// <param name="idPerfil"></param>
        /// <param name="idOpc"></param>
        /// <returns></returns>
        public string OpcionHtml(List<DTOOpcion> datos,int idPerfil,int idOpc)
        {
            Resultado resultado = new Resultado();
            StringBuilder sb = new StringBuilder();
            if (!isLogout(ref resultado))
            {
                var i = 1;

                if (idOpc == 0)
                {
                    sb.AppendFormat("<ul id='ulPermisos_{0}' style='list-style:none;'>", i);
                    foreach (var item in datos)
                    {
                        ////var opciones = item.PerfilOpcion.Where(x => x.CodigoPerfil == idPerfil).ToList();
                        //var opciones = 0;
                        //datos.ForEach(x =>
                        //{
                        //    var obj = new PerfilOpcionLogica().PerfilOpcionXOpc(Convert.ToInt32(x.CodigoOpcion));
                        //    if (obj != null)
                        //    {
                        //        var CodigoPerfil = obj.CodigoPerfil;
                        //        if (CodigoPerfil == idPerfil) opciones++;
                        //    }
                        //});

                        //if (opciones != 0)
                        //{
                            if (item.Nivel == 1)
                            {
                                if (item.Nombre != string.Empty)
                                {
                                    var sa = "";
                                    var lt = "";
                                    var et = "";
                                    var check = "checked='checked'";

                                    if (item.TipoAcceso != "" && item.TipoAcceso == "N")
                                    {
                                        sa = check;
                                    }
                                    else if (item.TipoAcceso != "" && item.TipoAcceso == "W")
                                    {
                                        et = check;
                                    }
                                    else if (item.TipoAcceso != "" && item.TipoAcceso == "R")
                                    {
                                        lt = check;
                                    }
                                    else
                                    {
                                        sa = check;
                                    }
                                    sb.Append("<li style='display:block;' >");
                                    sb.AppendFormat("<div style='width:100%; border-bottom: medium double #a6c9e2 ;'><img src='../Imagen/icono/minus.png' width=16 id='imgExpandOpc_{2}_{1}'  onclick='verOpcionesRec({2},{1});'><b><i>{0}</i></b>", item.Nombre, item.CodigoOpcion, idPerfil);

                                    sb.AppendFormat("<div style='float:right;  '>");
                                    sb.AppendFormat("<input type='radio' id='rbSinAcceso_{0}_{2}' name='opcion_{1}' value='N' class='rbOpcion' onclick='cambiarRadioOpciones(this,{1});' {3} /><label for='rbSinAcceso_{0}_{2}' title='Sin Acceso'>Sin Acceso</label>", idPerfil, item.CodigoOpcion, i, sa);
                                    sb.AppendFormat("<input type='radio' id='rbEscritura_{0}_{2}' name='opcion_{1}' value='W' class='rbOpcion' onclick='cambiarRadioOpciones(this,{1});' {3} /><label for='rbEscritura_{0}_{2}' title='Escritura'>Con Acceso</label>", idPerfil, item.CodigoOpcion, i, et);
                                  //  sb.AppendFormat("<input type='radio' id='rbLectura_{0}_{2}' name='opcion_{1}' value='R' class='rbOpcion' onclick='cambiarRadioOpciones(this,{1});' {3} /><label for='rbLectura_{0}_{2}' title='Lectura'>Read</label>", idPerfil, item.CodigoOpcion, i, lt);

                                    sb.AppendFormat("<input type='hidden' id='hidCodigoOpcion_{0}' value='{0}' /></div>", item.CodigoOpcion);
                                    sb.AppendFormat("<div id='divGrillaOpc_{1}_{0}'></div>", item.CodigoOpcion, idPerfil);
                                    sb.Append("</div>");

                                    if (item.CodigoOpcionPadre != null || item.CodigoOpcionPadre != 0)
                                    {
                                        var res = OpcionHtml(datos, idPerfil, Convert.ToInt32(item.CodigoOpcion));
                                        sb.AppendFormat(" <div id='divContentOpc_{1}_{0}' > {2} </div>", item.CodigoOpcion, idPerfil, res);
                                    }

                                    sb.Append("</li>");
                                    i++;
                                }
                          //  }
                        }
                    }
                    sb.AppendFormat("<input type='hidden' id='hidNumOpcion_{0}' value='{1}' />", idPerfil, i);
                    sb.Append("</ul>");
                }
                else
                {
                    sb.Append("<ul style='list-style:none;'>");
                    foreach (var item in datos)
                    {
                        if (item.CodigoOpcionPadre == idOpc)
                        {
                            if (item.Nombre != string.Empty)
                            {
                                var sa = "";
                                var lt = "";
                                var et = "";
                                var check = "checked='checked'";

                                if (item.TipoAcceso != "" && item.TipoAcceso == "N")
                                {
                                    sa = check;
                                }
                                else if (item.TipoAcceso != "" && item.TipoAcceso == "W")
                                {
                                    et = check;
                                }
                                else if (item.TipoAcceso != "" && item.TipoAcceso == "R")
                                {
                                    lt = check;
                                }
                                else
                                {
                                    sa = check;
                                }
                                sb.AppendFormat("<li style='display:block; id='liOpcion_{0}'>", item.CodigoOpcion);
                                sb.AppendFormat("<div style='width:100%; border-bottom: 1px solid #a6c9e2 ;'  ><img src='../Imagen/icono/minus.png' width=16 id='imgExpandOpc_{2}_{1}'  onclick='verOpcionesRec({2},{1});'>{0}", item.Nombre, item.CodigoOpcion, idPerfil);
                                sb.AppendFormat("<div style='float:right;'>");
                                sb.AppendFormat("<input type='radio' id='rbSinAcceso_{0}_{2}' name='opcion_{1}' value='N' class='rbOpcion' onclick='cambiarRadioOpciones(this,{1});' {3} /><label for='rbSinAcceso_{0}_{2}' title='Sin Acceso'>Sin Acceso</label>", idOpc, item.CodigoOpcion, i, sa);
                                sb.AppendFormat("<input type='radio' id='rbEscritura_{0}_{2}' name='opcion_{1}' value='W' class='rbOpcion' onclick='cambiarRadioOpciones(this,{1});' {3} /><label for='rbEscritura_{0}_{2}' title='Escritura'>Con Acceso</label>", idOpc, item.CodigoOpcion, i, et);
                              //  sb.AppendFormat("<input type='radio' id='rbLectura_{0}_{2}' name='opcion_{1}' value='R' class='rbOpcion' onclick='cambiarRadioOpciones(this,{1});' {3} /><label for='rbLectura_{0}_{2}' title='Lectura'>Read </label></div>", idOpc, item.CodigoOpcion, i, lt);
                                sb.AppendFormat("<div id='divGrillaOpc_{1}_{0}'></div>", item.CodigoOpcion, idPerfil);
                                sb.Append("</div>");
                                if (item.CodigoOpcionPadre != null || item.CodigoOpcionPadre != 0)
                                {
                                    var res = OpcionHtml(datos, idPerfil, Convert.ToInt32(item.CodigoOpcion));
                                    sb.AppendFormat(" <div id='divContentOpc_{1}_{0}' > {2} </div>", item.CodigoOpcion, idPerfil, res);
                                }
                                sb.Append("</li>");
                                i++;
                            }
                        }
                    }
                    sb.AppendFormat("<input type='hidden' id='hidNumOpcion_{0}' value='{1}' />", idOpc, i);
                    sb.Append("</ul>");
                }
            }
            return sb.ToString();
        }

        public JsonResult ObtenerUsuario(int CodigoPerfilUsuario)
        {
            Resultado resultado = new Resultado();
            try
            {
                if (!isLogout(ref resultado))
                {
                    //PerfilUsuarioOficinaDetalleLogica perfilUsuOfiDeta = new PerfilUsuarioOficinaDetalleLogica();
                   
                    List<DTOOpcion> opciones = new List<DTOOpcion>();
                    //var opcionDetalle = perfilUsuOfiDeta.obtenerPerfilUsuarioOficinaDetalleXCod(CodigoPerfilUsuario);
                    
                    var objPerUsuOfi = new PerfilUsuarioOficinaLogica().obtenerPerfilUsuarioOficinaXCodPerf(CodigoPerfilUsuario);
                    var idPerfil = 0;
                    var idOficina = 0;
                    var idUbicacion = 0;
                    var CodigoUsuario = 0;
                    var NombreUsuario = "";
                    if(objPerUsuOfi != null){
                        idPerfil = objPerUsuOfi.CodigoPerfil;
                        var usuOficina = new UsuarioOficinaLogica().obtenerUsuOfiXCodigo(objPerUsuOfi.CodigoUsuarioOficina);
                        var oficina = new OficinaLogica().ObtenerOficina(Convert.ToDecimal(usuOficina.CodigoOficina));
                        if (oficina != null)
                        {
                            idOficina = oficina.CodigoOficina;
                            idUbicacion = oficina.CodigoUbicacion;
                            CodigoUsuario = usuOficina.CodigoUsuario;
                        }
                    }
                    var idModulo = new PerfilLogistica().ObtenerPerfil(idPerfil).CodigoModulo;
                    var idSistema = new ModuloLogistica().ObtenerModulo(Convert.ToDecimal(idModulo)).CodigoSistema;
                    var objSis = new SistemaLogica().ObtenerSistema(idSistema);
                    var DescripcionSistema = "";
                    if (objSis != null) DescripcionSistema = objSis.Prefijo + " - " + objSis.Descripcion;

                    var usuario = new UsuarioLogica().ObtenerUsuario(CodigoUsuario);
                    if (usuario != null) { NombreUsuario = usuario.Nombre + usuario.Paterno + usuario.Materno; }
                    DTOUsuario usu = new DTOUsuario();
                    var count = 0;
                    if (UsuariosTmp == null)
                    {
                        UsuariosTmp = new List<DTOUsuario>();
                    }
                    else
                    {
                        count = UsuariosTmp.Where(x => x.CodigoUsuario == CodigoUsuario).Count();
                    }

                    if (count == 0)
                    {
                        usu.CodigoUsuario = CodigoUsuario;
                        usu.Nombre = NombreUsuario;
                        UsuariosTmp.Add(usu);
                    }

                    OpcionLogica servicioOpcion = new OpcionLogica();
                    var opcionDetalle = servicioOpcion.ListarOpcionXPerfilUsu(CodigoPerfilUsuario, idPerfil);
                    opcionDetalle.ForEach(x =>
                    {
                        DTOOpcion opcion = new DTOOpcion();
                        //var opc = new OpcionLogica().OpcionXCodigo(x.CodigoOpcion);

                        opcion.CodigoOpcion = x.CodigoOpcion;
                        opcion.CodigoModulo = Convert.ToDecimal(x.CodigoModulo);
                        opcion.Anulado = x.Anulado;
                        opcion.CodigoOpcionPadre = x.CodigoOpcionPadre;
                        opcion.Descripcion = x.Descripcion;
                        opcion.Nivel = x.Nivel;
                        opcion.Ruta = x.Ruta;
                        opcion.Nombre = x.Nombre;
                        opcion.TipoAcceso = x.TipoAcceso;
                        opcion.CodigoPerfil = idPerfil;

                        //if (opc != null)
                        //{
                            opciones.Add(opcion);
                        //}
                    });

                    if (opciones != null)
                    {
                        StringBuilder sbo = new StringBuilder();
                        sbo.AppendFormat("<table id='tb_{0}' border=0  style=' width:100%; text-align:left;'><tr><td style='text-align:top;'>", idPerfil);
                        var str = OpcionHtml(opciones, idPerfil, 0);
                        sbo.Append(str);
                        sbo.Append("</td></tr><table>");

                        PerfilLogistica servicio = new PerfilLogistica();
                        var datos = servicio.ListarXModulo(Convert.ToInt32(idModulo), idPerfil);

                        StringBuilder sb = new StringBuilder();
                        if (datos != null)
                        {
                            sb.Append("<center><div  class='divFiltro'><table  style=' width:90%;text-align:left;  box-shadow: 5px 10px 7px rgba(0,0,0,0.5);background:#ecf8fd;   border:1px #a6c9e2 solid;'>");

                            foreach (var item in datos)
                            {
                                sb.Append(" <tr>");
                                sb.AppendFormat("<td colspan=2 style='font-size:11px;text-decoration:underline;'><img src='../Imagen/icono/minus.png' width=16 id='imgExpandOpc_{1}'  onclick='verOpciones({1});'>{0} ", item.Nombre, item.CodigoPerfil);

                                if (item.Nombre != string.Empty)
                                {
                                    //sb.AppendFormat("&nbsp;&nbsp; <a href='#' onclick='return addOpcion({0});'  title='Agregar opción al perfil - Nivel 1'><img src='../Imagen/icono/option.png' width=16></a>", item.CodigoPerfil);
                                    sb.AppendFormat("<input type='checkbox' id='cbPerfil_{0}' onclick='return cambiarEscritura(this,{0});' />", item.CodigoPerfil);
                                    sb.AppendFormat("<input type='hidden' id='hidPerfil' value='{0}' />", item.CodigoPerfil);
                                }
                                sb.Append("</td> </tr>");
                                sb.AppendFormat(" <div id='divContentOpc_{0}'></div>", item.CodigoPerfil);
                                sb.Append(" <tr>");
                                sb.AppendFormat("<td colspan='2'><div id='divGrillaOpc_{0}'>{1}</div></td>", item.CodigoPerfil,sbo);
                                sb.Append(" </tr>");
                                //sb.Append(" </div>");
                            }
                            sb.Append("<table></div></center>");

                            DTOAsignacion asignacion = new DTOAsignacion();
                            asignacion.idPerfil = idPerfil;
                            asignacion.idModulo = Convert.ToInt32(idModulo);
                            asignacion.idSistema = idSistema;
                            asignacion.DescripcionSistema = DescripcionSistema;
                            asignacion.idOficina = idOficina;
                            asignacion.idUbicacion = idUbicacion;
                            asignacion.CodigoPerfilUsuario = CodigoPerfilUsuario;
                            asignacion.NombreUsuario = NombreUsuario;

                            resultado.data = Json(asignacion, JsonRequestBehavior.AllowGet);
                            resultado.result = 1;
                            resultado.message = sb.ToString();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                resultado.result = 0;
                resultado.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ObtenerUsuario", ex);
            }
            return Json(resultado, JsonRequestBehavior.AllowGet);
        }
        public JsonResult EliminarPerfilUsuario(int CodigoPerfilUsuario)
        {
            Resultado resultado = new Resultado();
            try
            {
                if (!isLogout(ref resultado))
                {
                    PerfilUsuarioOficina obj = new PerfilUsuarioOficina();
                    PerfilUsuarioOficinaLogica servicio = new PerfilUsuarioOficinaLogica();

                    obj.CodigoPerdilUsuario = CodigoPerfilUsuario;
                    var result = servicio.Eliminar(obj);

                    if (result != 0)
                    {
                        resultado.result = 1;
                        resultado.message = Constante.MensajeGenerico.MSG_OK_ELIMINAR;
                    }
                    else
                    {
                        resultado.result = 0;
                        resultado.message = Constante.MensajeGenerico.MSG_ERROR_ELIMINAR;
                    }
                }
            }
            catch (Exception ex)
            {
                resultado.result = 0;
                resultado.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "EliminarPerfilUsuario", ex);
            }
            return Json(resultado, JsonRequestBehavior.AllowGet);
        }
        public JsonResult ActualizarOrdenOpcPerfil(int idPerfil,int idOpc,short orden, int  opcion,int idOpcPadre)
        {
            Resultado resultado = new Resultado();
            try
            {
                if (!isLogout(ref resultado))
                {
                    bool opcOK = false;
                    if (opcion == 1) { orden--; opcOK = true; }
                    if (opcion == -1) { orden++; opcOK = true; }


                    OpcionLogica servicio = new OpcionLogica();
                    var result = servicio.ActualizarOrden(idPerfil, idOpc, orden, UsuarioActualCodigo,idOpcPadre);
                    if (opcOK)
                    {
                        
                            resultado.result = 1;
                            resultado.message = Constante.MensajeGenerico.MSG_OK_GENERICO;
                        
                    }
                    else {
                        resultado.result = 0;
                        resultado.message = "No se envío el parametro esperado [up or down]";
                    
                    }
                }
            }
            catch (Exception ex)
            {
                resultado.result = 0;
                resultado.message = Constante.MensajeGenerico.MSG_ERROR_GENERICO;
                ucLogApp.ucLog.GrabarLogError(NombreAPP, UsuarioActual, "ActualizarOrdenOpcPerfil", ex);
            }
            return Json(resultado, JsonRequestBehavior.AllowGet);
        }
    }
}
